package com.FOD.clases;

import java.io.ObjectInputStream;

import javax.microedition.khronos.opengles.GL10;

import android.content.Context;
import android.util.Log;
import rajawali.BaseObject3D;
import rajawali.SerializedObject3D;
import rajawali.lights.PointLight;
import rajawali.materials.DiffuseMaterial;
import rajawali.parser.ObjParser;
import rajawali.renderer.RajawaliRenderer;
import rajawali.util.ObjectColorPicker;
import rajawali.util.OnObjectPickedListener;

/**
 * Clase auxiliar para renderear le modelo 3D
 * @author rafa
 *
 */
public class BodyRenderer extends RajawaliRenderer implements OnObjectPickedListener{
	private PointLight mLight;

	BaseObject3D backbone; // Objeto 3D
	float point;
	private ObjectColorPicker mPicker; // para seleccionar un objeto

	public BodyRenderer(Context context) {
		super(context);
		// frames por segundo
		setFrameRate(60);
	}

	/**
	 * Al inicializar el ambiente
	 */
	@Override
	protected void initScene() {
		// Preparamos el objeto que estara escuchando si algun objet es seleccionado
		mPicker = new ObjectColorPicker(this);
		mPicker.setOnObjectPickedListener(this);
		// creamos una luz para el ambiente
		mLight = new PointLight();
		mLight.setPosition(0, 0, 0);
		mLight.setPower(5f);
		
		// Colocamos la camara y haciadond mirara
		mCamera.setPosition(0, 0,7);
		mCamera.setLookAt(0, 0, 0);
		
		try {
			/**
			 * Para cargar un objeto serializado mas rapido (Y)
			 */
			/*ObjectInputStream ois = new ObjectInputStream(mContext.getResources().openRawResource(R.raw.monkey_ser));
			SerializedObject3D serializedMonkey = (SerializedObject3D) 
			ois.readObject();
			ois.close();*/
			
			/**
			 * Parsear un obj (blender) y asignarlo a un BaseObject3D
			 */
			ObjParser objParser = new ObjParser(mContext.getResources(), mTextureManager, R.raw.craneo_obj);
			objParser.parse();
			backbone = objParser.getParsedObject();
			
			//backbone = new BaseObject3D(serializedMonkey);
			backbone.addLight(mLight); // asignamos la luz al objeto
			//backbone.setScale(.7f);
			backbone.setPosition(0, 0, 0); // damos una posicion al objeto 3D
			backbone.setRotY(0); // le decimso que no se rote
			
			addChild(backbone);  // Asignamos el objeto al ambiente 3D
			// Registramosel objeto para que pueda ser escuchado cuando se presione este
			mPicker.registerObject(backbone);
		} catch (Exception e){
			
		}
		
		// Creamos un material
		DiffuseMaterial material = new DiffuseMaterial();
		material.setUseColor(true);
		// lo asignamos
		backbone.setMaterial(material);
		backbone.setColor(0xff0000); // le damos un color
		

	}

	/**
	 * Cuando detecte que objeto tiene k rotar en el eje Y
	 * @param rotY cuanto vaa rotar el objeto
	 */
	public void rotObjY(float rotY) {
		backbone.setRotY(backbone.getRotY() + rotY);
	}
	
	/**
	 * Cuando detecte que tiene que mover la camara verticalmente
	 * @param moveY Cuanto se movera la camara
	 */
	public void moveCamY(float moveY) {
		//mCamera.setY(mCamera.getY() + moveY);
		backbone.setY(backbone.getY() + moveY);
	}

	/**
	 * Cuando detecte que el usuario esta haciendo el gesto de zoom
	 * @param zoom  La escala que el usuario esta haciendo alejar/acercar
	 */
	public void zoomObj(float zoom) {
		// si la escala es menor a uno el zoom es negativo si es mayor a uno el zoom es positivo (siempre .5f)
		float finalZoom = getCamera().getZ() + ((zoom < 1) ? -.5f : .5f);
		/*
		 * Mientras el zoom no supere los limites establecidos  20f y 7f se aplica el zoom
		 */
		if (finalZoom < 20f && finalZoom > 7f) {
			getCamera().setZ(finalZoom);
		}

		Log.w("TOUCH", "" + getCamera().getZ());
	}

	/**
	 * Cada que el ambiente dibuja
	 */
	@Override
	public void onDrawFrame(GL10 glUnused) {
		super.onDrawFrame(glUnused);
		// backbone.setRotY(backbone.getRotY()+1);
		// backbone.setRotX(backbone.getRotX()+.5f);
	}
	
	/**
	 * Detecta que objeto se selecciono en las coordeanadas dadas
	 * @param x coo X
	 * @param y coo Y
	 */
	public void getObjectAt(float x, float y) {
		mPicker.getObjectAt(x, y);
	}

	/**
	 * Cuando un objeto es seleccionado en pantalla
	 */
	public void onObjectPicked(BaseObject3D object) {
		// Se le aplica un zoom
		object.setZ(object.getZ() == 0 ? -2 : 0);
		
		// se genera un material y asignamos un color
		DiffuseMaterial material = new DiffuseMaterial();
		material.setUseColor(true);
		
		// se asigna un nuevo color dependiendo del color anterior (alterniando solo entre dos colores)
		if(object.getZ() == -2){
		backbone.setMaterial(material);
		backbone.setColor(0x00FFFF);
		}else{
			backbone.setMaterial(material);
			backbone.setColor(0xff0000);
		}
	}
}
